//
//  TFTableDataHandlerProtocol.h
//  TFFoundation
//
//  Created by TFAppleWork-Summer on 2017/4/25.
//  Copyright © 2017年 TFAppleWork-Summer. All rights reserved.
//

#import <UIKit/UIKit.h>

@class TFRequest;
@class ASBatchContext;
@class TFTableViewSection;
@class TFTableViewItem;

@protocol TFTableDataRequestProtocol;
@protocol TFTableViewControllerProtocol;

/**
 数据对等模式
 */
typedef NS_ENUM(NSUInteger, TFTableDataPeeringMode) {
    /**
     数据对等模式--一个数据模型对应一个row
     */
    TFTableDataPeeringModeRow,
    /**
     数据对等模式--一个数据模型对应一个section
     */
    TFTableDataPeeringModeSection,
};

/**
 tableView刷新方式
 */
typedef NS_ENUM(NSUInteger, TFTableViewReloadOption) {
    /**
     tableView刷新方式--普通的类型通过tableview的增删改查的方式进行reload,
     */
    TFTableViewReloadOptionNormal,
    /**
     tableView刷新方式--直接reloadData
     */
    TFTableViewReloadOptionReloadData,
};

/**
 tableview数据处理工具类代理
 */
@protocol TFTableDataHandlerDelegate <NSObject>

@optional;

/**
 对等模式为Row的情况下需要根据section和listArray添加TFTableViewItem

 @param section 对应的section
 @param listArray 数据数组
 */
- (void)dataHandlePeeringModeRowShouldAddNewItemsWithSection:(nonnull TFTableViewSection *)section listArray:(nonnull NSArray *)listArray;

/**
 数据处理者创建默认的section的时候调用

 @param section TFTableViewSection
 */
- (void)dataHandlePeeringModeRowSectionDidInit:(nonnull TFTableViewSection *)section;

/**
 对等模式为Section的情况下需要根据listArray添加TFTableViewSection

 @param listArray 数据数组
 */
- (void)dataHandlePeeringModeSectionShouldAddNewSectionsWithListArray:(nonnull NSArray *)listArray;

/**
 处理错误的回调方法

 @param pageNumber 页码
 */
- (void)dataHandleErrorWithPageNumber:(NSInteger)pageNumber;

/**
 有数据开始处理数据时会调用，添加上拉加载，下拉刷新
 
 @param pageNumber 页码
 */
- (void)dataHandleHasDataAtPageNumber:(NSInteger)pageNumber;

/**
 删除动画方式，默认UITableViewRowAnimationMiddle

 @return UITableViewRowAnimation
 */
- (UITableViewRowAnimation)dataHandleDeleteAnimation;

/**
 插入动画方式，默认UITableViewRowAnimationMiddle

 @return UITableViewRowAnimation
 */
- (UITableViewRowAnimation)dataHandleInsertAnimation;

/**
 刷新动画方式，默认UITableViewRowAnimationFade
 
 @return UITableViewRowAnimation
 */
- (UITableViewRowAnimation)dataHandleReloadAnimation;

/**
 无数据
 */
- (void)dataHandleNoData;

/**
 没有更多数据
 */
- (void)dataHandleNoMoreData;

/**
 tableview刷新完成之后处理

 @param loadFromCache 是否从缓存加载
 */
- (void)dataHandleUpdateTableViewCompletedWithLoadFromCache:(BOOL)loadFromCache;

@end

/**
 tableview数据处理工具类必须服从的协议
 */
@protocol TFTableDataHandlerProtocol <NSObject>

/**
 代理者
 */
@property (nonatomic, weak, nullable) id<TFTableDataHandlerDelegate,TFTableViewControllerProtocol> delegate;

/**
 已加载数据是否从缓存中加载
 */
@property (nonatomic, assign) BOOL loadedDataIsCache;

/**
 根据请求的类处理返回数据
 
 @param peeringMode 对等方式
 @param reloadOption 载入方式
 @param context as的上下文
 */
- (void)handleDataListWithPeeringMode:(TFTableDataPeeringMode)peeringMode reloadOption:(TFTableViewReloadOption)reloadOption context:(nullable ASBatchContext *)context;

@end
